const FILE_TYPES = {
  image: ['jpg', 'jpeg', 'png', 'gif', 'svg', 'webp', 'ico', 'bmp'],
  video: ['mp4', 'avi', 'wmv', 'mov', 'flv', '3gp', 'mkv'],
  audio: ['mp3', 'wav', 'wma', 'ogg', 'aac', 'flac'],
  'file-pdf': ['pdf'],
  'file-word': ['doc', 'docx'],
  'file-excel': ['xls', 'xlsx'],
  'file-edit': ['txt'],
  code: [
    'html',
    'css',
    'scss',
    'less',
    'js',
    'ts',
    'jsx',
    'tsx',
    'vue',
    'json'
  ],
  file: ['xmind', 'ppt', 'pptx', 'zip', 'rar', '7z'],
  android: ['apk'],
  apple: ['ipa']
};

export function getFileType(filename) {
  if (typeof filename !== 'string')
    return console.error('filename must be a string');
  const fileExtension = filename.split('.').pop();
  let fileType = 'unknown_type';
  const types = Object.keys(FILE_TYPES);
  for (let i = 0; i < types.length; i++) {
    const type = types[i];
    if (FILE_TYPES[type].includes(fileExtension)) {
      fileType = type;
      break;
    }
  }
  if (fileType === 'unknown_type') {
    return {
      extension: 'unknown_type',
      type: fileType
    };
  }
  return {
    extension: fileExtension,
    type: fileType
  };
}

export function formatFileSize(size) {
  size = +size;
  if (size < 1024) {
    return size.toFixed(0) + ' B';
  } else if (size < 1024 * 1024) {
    return (size / 1024).toFixed(2) + ' KB';
  } else if (size < 1024 * 1024 * 1024) {
    return (size / 1024 / 1024).toFixed(2) + ' MB';
  } else {
    return (size / 1024 / 1024 / 1024).toFixed(2) + ' GB';
  }
}

export function debounce(fn, duration) {
  let timer;
  return function (...args) {
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, args);
    }, duration);
  };
}

// 日期格式化
export function parseTime(time, pattern) {
  if (arguments.length === 0 || !time) {
    return null;
  }
  const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}';
  let date;
  if (typeof time === 'object') {
    date = time;
  } else {
    if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
      time = parseInt(time);
    } else if (typeof time === 'string') {
      time = time
        .replace(new RegExp(/-/gm), '/')
        .replace('T', ' ')
        .replace(new RegExp(/\.[\d]{3}/gm), '');
    }
    if (typeof time === 'number' && time.toString().length === 10) {
      time = time * 1000;
    }
    date = new Date(time);
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  };
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key];
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value];
    }
    if (result.length > 0 && value < 10) {
      value = '0' + value;
    }
    return value || 0;
  });
  return time_str;
}
